package date0703am;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.JDBCType;
import java.sql.ParameterMetaData;
import java.sql.ResultSet;


public class JdbcTest16 {

	public static void main(String[] args) throws Exception {
		
		String driver = "com.mysql.cj.jdbc.Driver"  ;
		String url = "jdbc:mysql://localhost:3306/ecut?serverTimezone=Asia/Shanghai&useSSL=false" ;
		String user = "ecuter" ;
		String password = "ecuter" ;
		
		// 1、加载驱动
		Class.forName( driver );
		
		// 2、获取连接
		Connection conn = DriverManager.getConnection(url, user, password);
		
		String expression = "call getname( ? , ? )" ; // getname 是在 MySQL 中创建的一个存储过程
		
		// 3、创建 Statement 对象 ( Statement 、PreparedStatement 、CallableStatement )
		CallableStatement cs = conn.prepareCall( expression );  // CallableStatement 是 PreparedStatement 的子接口
		
		System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " );
		
		ParameterMetaData meta = cs.getParameterMetaData() ;  // 获取 参数元数据
		System.out.println( "参数个数: " + meta.getParameterCount()  ) ; // 获取 参数个数
		System.out.println( "第一个参数数据库类型: " + meta.getParameterTypeName( 1 ) ) ; // 获取第一个参数对应的数据库类型
		System.out.println( "第一个参数Java类型: " + meta.getParameterClassName( 1 ) ) ; // 获取第一个参数对应的的 Java 类型
		System.out.println( "第一个参数模式: " +meta.getParameterMode( 1 ) ) ; // 获取第一个参数的模式 ( 1 表示 parameterModeIn )
		System.out.println( "第二个参数模式: " +meta.getParameterMode( 2 ) ) ; // 获取数据库元数据 ( 4 表示 parameterModeOut )
		
		System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " );
		
		// 设置 参数占位符 的 参数值
		cs.setInt( 1 ,  3 ); // setInt( int paramIndex , int paramValue )
		cs.registerOutParameter( 2 , JDBCType.VARCHAR ); // 注册传出参数
		
		// 4、调用存储过程
		boolean executeResult = cs.execute() ;
		
		// 5、处理结果
		if( executeResult ) {
			ResultSet rs = cs.getResultSet() ;

			// 遍历结果集
            
			rs.close(); // 关闭结果集
		} else {
			String name = cs.getString( 2 ); // 从第二个参数占位符中获取返回值
			System.out.println( name );
		}
		
		// 6、释放资源
		cs.close();
		conn.close();

	}

}
